www.gusucode.com > vc++ 远程控制示例源程序-源码程序 > vc++ 远程控制示例源程序-源码程序\code\PeerYouC\PeerFileListView.cpp
//Download by http://www.NewXing.com // PeerFileListView.cpp : implementation file // #include "stdafx.h" #include "peeryouc.h" #include "PeerFileListView.h" #include "Createdirdlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPeerFileListView IMPLEMENT_DYNCREATE(CPeerFileListView, CView) CPeerFileListView::CPeerFileListView() { } CPeerFileListView::~CPeerFileListView() { } BEGIN_MESSAGE_MAP(CPeerFileListView, CView) //{{AFX_MSG_MAP(CPeerFileListView) ON_WM_CREATE() ON_WM_SIZE() ON_COMMAND(ID_PEER_FILE_LOCAL_REPORT, OnPeerFileLocalReport) ON_COMMAND(ID_PEER_FILE_LOCAL_LIST, OnPeerFileLocalList) ON_COMMAND(ID_PEER_FILE_LOCAL_BIG, OnPeerFileLocalBig) ON_COMMAND(ID_PEER_FILE_LOCAL_SMALL, OnPeerFileLocalSmall) ON_CBN_SELCHANGE(ID_PEER_FILE_LOCAL_DROPLIST,OnSelectChange) ON_NOTIFY(NM_DBLCLK,1000, OnLocalLD ) ON_NOTIFY(NM_RCLICK,1000, OnLocalRC ) ON_NOTIFY(LVN_BEGINDRAG,1000, OnBeginDrag ) ON_COMMAND(IDR_FILE_LOCAL_CREATEDIR, OnFileLocalCreatedir) ON_COMMAND(IDR_FILE_LOCAL_DELFILE, OnFileLocalDelfile) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPeerFileListView drawing void CPeerFileListView::OnDraw(CDC* pDC) { CDocument* pDoc = GetDocument(); // TODO: add draw code here } ///////////////////////////////////////////////////////////////////////////// // CPeerFileListView diagnostics #ifdef _DEBUG void CPeerFileListView::AssertValid() const { CView::AssertValid(); } void CPeerFileListView::Dump(CDumpContext& dc) const { CView::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CPeerFileListView message handlers int CPeerFileListView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here if(!list.Create( WS_VISIBLE|WS_CHILD,CRect(0,0,0,0),this,1000)) return -1; list.ModifyStyle(0,LVS_REPORT); style=LVS_REPORT; LVCOLUMN colinfo; memset(&colinfo,0,sizeof(colinfo)); colinfo.mask=LVCF_TEXT|LVCF_WIDTH; colinfo.cx=100; colinfo.cchTextMax=255; colinfo.pszText="名称"; colinfo.iSubItem=0; colinfo.iOrder=0; list.InsertColumn(0,&colinfo); colinfo.pszText="类型"; colinfo.iSubItem=1; colinfo.iOrder=1; list.InsertColumn(1,&colinfo); colinfo.pszText="大小"; colinfo.iSubItem=2; colinfo.iOrder=2; list.InsertColumn(2,&colinfo); colinfo.pszText="修改时间"; colinfo.iSubItem=3; colinfo.iOrder=3; list.InsertColumn(3,&colinfo); imagelists.Create(16,16,ILC_MASK,16,1); imagelistb.Create(32,32,ILC_MASK,16,1); imagelists.Add(AfxGetApp()->LoadIcon(IDI_DIR)); imagelistb.Add(AfxGetApp()->LoadIcon(IDI_DIR)); list.SetImageList(&imagelists,LVSIL_SMALL); list.SetImageList(&imagelistb,LVSIL_NORMAL); list.Register(); if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP |CBRS_TOOLTIPS | CBRS_FLYBY /*| CBRS_SIZE_DYNAMIC*/) || !m_wndToolBar.LoadToolBar(IDR_PEER_FILE_LOCAL)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } AddToolBarButton(); if(!image.Create(16,16,ILC_MASK,4,1)) return -1; image.Add(AfxGetApp()->LoadIcon(IDI_DRIVER_A)); image.Add(AfxGetApp()->LoadIcon(IDI_DRIVER_FIX)); image.Add(AfxGetApp()->LoadIcon(IDI_DRIVER_CD)); image.Add(AfxGetApp()->LoadIcon(IDI_DRIVER_NET)); m_wndToolBar.m_driver.SetImageList(&image); return 0; } void CPeerFileListView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); m_wndToolBar.MoveWindow(0,0,cx,25); list.MoveWindow(0,25,cx,cy-25); // TODO: Add your message handler code here } void CPeerFileListView::AddToolBarButton() { #define COMBO_BOX_WIDTH 80 int index = 0; CRect rect; while(m_wndToolBar.GetItemID(index)!= ID_PEER_FILE_LOCAL_STATIC) index++; m_wndToolBar.SetButtonInfo(index, ID_PEER_FILE_LOCAL_STATIC,TBBS_SEPARATOR,110); m_wndToolBar.GetItemRect(index, &rect); rect.top+=4; // then .Create the combo box and show it if (!m_wndToolBar.m_title.Create( "Local Machine", WS_CHILD|WS_VISIBLE , rect, &m_wndToolBar, ID_PEER_FILE_LOCAL_STATIC)) { TRACE0("Failed to create combo-box\n"); return ; } index=0; while(m_wndToolBar.GetItemID(index)!= ID_PEER_FILE_LOCAL_DROPLIST) index++; m_wndToolBar.SetButtonInfo(index, ID_PEER_FILE_LOCAL_DROPLIST,TBBS_SEPARATOR,COMBO_BOX_WIDTH); m_wndToolBar.GetItemRect(index, &rect); rect.top+=2; rect.bottom += 200; // then .Create the combo box and show it if (!m_wndToolBar.m_driver.Create( WS_CHILD|WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWNLIST , rect, &m_wndToolBar, ID_PEER_FILE_LOCAL_DROPLIST)) { TRACE0("Failed to create combo-box\n"); return ; } m_wndToolBar.m_driver.ShowWindow(SW_SHOW); m_wndToolBar.m_title.ShowWindow(SW_SHOW); } void CPeerFileListView::OnPeerFileLocalReport() { // TODO: Add your command handler code here list.ModifyStyle(style,LVS_REPORT); style=LVS_REPORT; } void CPeerFileListView::OnPeerFileLocalList() { // TODO: Add your command handler code here list.ModifyStyle(style,LVS_LIST); style=LVS_LIST; } void CPeerFileListView::OnPeerFileLocalBig() { // TODO: Add your command handler code here list.ModifyStyle(style,LVS_ICON ); style=LVS_ICON; } void CPeerFileListView::OnPeerFileLocalSmall() { // TODO: Add your command handler code here list.ModifyStyle(style,LVS_SMALLICON ); style=LVS_SMALLICON ; } void CPeerFileListView::OnSelectChange() { m_wndToolBar.m_driver.GetLBText(m_wndToolBar.m_driver.GetCurSel(),path); AfxGetApp()->DoWaitCursor(1); Retrive(); AfxGetApp()->DoWaitCursor(0); } void CPeerFileListView::Retrive() { list.DeleteAllItems(); int index=0; ////本地////// HANDLE hlocalfile; WIN32_FIND_DATA findd; CString nowpath; nowpath=path+"\\*"; memset(&findd,0,sizeof(findd)); int imagecount; imagecount=imagelists.GetImageCount(); for(int j=1;j<imagecount;j++) { imagelists.Remove(j); imagelistb.Remove(j); } CImageList* pSmallImage,* pBigImage; pSmallImage=list.GetImageList(LVSIL_SMALL); pBigImage=list.GetImageList(LVSIL_NORMAL); if((hlocalfile=FindFirstFile( nowpath,&findd))==INVALID_HANDLE_VALUE) return ; SHFILEINFO shfi; memset(&shfi,0,sizeof(shfi)); SHGetFileInfo(findd.cFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(shfi), SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME ); int indeximage; indeximage=pSmallImage->Add(shfi.hIcon); pBigImage->Add(shfi.hIcon); index=list.GetItemCount(); list.InsertItem(index,".",0); list.SetItem(index,1,LVIF_TEXT,"文件夹",0,0,0,NULL); index=list.GetItemCount(); list.InsertItem(index,"..",0); list.SetItem(index,1,LVIF_TEXT,"文件夹",0,0,0,NULL); index=list.GetItemCount(); DWORD len; char slen[30]; CTime time; CString stime; if(strcmp(findd.cFileName,".")!=0&& strcmp(findd.cFileName,"..")!=0) { list.InsertItem(index,findd.cFileName, findd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?0:indeximage); list.SetItem(index,1,LVIF_TEXT,findd.dwFileAttributes& FILE_ATTRIBUTE_DIRECTORY?"文件夹":shfi.szTypeName,0,0,0,NULL); len=(findd.nFileSizeHigh*MAXDWORD+findd.nFileSizeLow)/1024; sprintf(slen,"%dK",len); list.SetItem(index,2,LVIF_TEXT,findd.dwFileAttributes& FILE_ATTRIBUTE_DIRECTORY?"":slen,0,0,0,NULL); time=findd.ftLastWriteTime; stime=time.Format("%Y-%m-%d %H:%M:%S"); list.SetItem(index,3,LVIF_TEXT,stime,0,0,0,NULL); } while(hlocalfile) { if(FindNextFile(hlocalfile,&findd)) { memset(&shfi,0,sizeof(shfi)); SHGetFileInfo(findd.cFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(shfi), SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME ); indeximage=pSmallImage->Add(shfi.hIcon); pBigImage->Add(shfi.hIcon); index=list.GetItemCount(); if(strcmp(findd.cFileName,".")!=0&& strcmp(findd.cFileName,"..")!=0) { list.InsertItem(index,findd.cFileName, findd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?0:indeximage); list.SetItem(index,1,LVIF_TEXT,findd.dwFileAttributes& FILE_ATTRIBUTE_DIRECTORY?"文件夹":shfi.szTypeName,0,0,0,NULL); len=(findd.nFileSizeHigh*MAXDWORD+findd.nFileSizeLow)/1024; sprintf(slen,"%dK",len); list.SetItem(index,2,LVIF_TEXT,findd.dwFileAttributes& FILE_ATTRIBUTE_DIRECTORY?"":slen,0,0,0,NULL); time=findd.ftLastWriteTime; stime=time.Format( "%Y-%m-%d %H:%M:%S"); list.SetItem(index,3,LVIF_TEXT,stime,0,0,0,NULL); } } else { if(GetLastError()==ERROR_NO_MORE_FILES) break; } } FindClose(hlocalfile); } void CPeerFileListView::OnLocalLD(NMHDR* pNotifyStruct,LRESULT* result) { if(list.GetItemCount()<=0) return; LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNotifyStruct; if(lpnmlv->iItem>=0) { CString filename,type; filename=list.GetItemText(lpnmlv->iItem,0); type=list.GetItemText(lpnmlv->iItem,1); if(type=="文件夹") { if(filename==".") goto there; else if(filename=="..") { int findc=path.ReverseFind('\\'); if(findc==-1) goto there; path=path.Left(findc); } else { path=path+"\\"+filename; } AfxGetApp()->DoWaitCursor(1); Retrive(); AfxGetApp()->DoWaitCursor(0); } else { ShellExecute(NULL, _T("open"), path+"\\"+filename, NULL,NULL, SW_SHOWNORMAL); } } there: *result=0; } void CPeerFileListView::OnInitialUpdate() { CView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the base class } void CPeerFileListView::OnBeginDrag(NMHDR* pNotifyStruct,LRESULT* result) { if(list.GetItemCount()<=2) return; //确信要拖动,而不是随便点击 //按下左键250ms则认为要拖动 Sleep(250); MSG msg; ::PeekMessage( &msg, GetSafeHwnd(), WM_LBUTTONUP, WM_LBUTTONUP, PM_NOREMOVE ); //随意点击而已,返回 if( msg.message==WM_LBUTTONUP ) return; DRAG Contens; Contens.flag=0; Contens.wnd=(DWORD)this; HGLOBAL hData = GlobalAlloc(GHND|GMEM_SHARE,sizeof(DRAG) ); char *pS = (char *)GlobalLock( hData ); memcpy( pS, (char*)&Contens,sizeof(DRAG)); GlobalUnlock( hData ); list.m_bDraging = TRUE; //开始拖动 COleDataSource source; source.CacheGlobalData( RegisterClipboardFormat("ListCtrl")/*CF_TEXT*/, hData ); source.DoDragDrop( DROPEFFECT_COPY ); GlobalFree( hData ); list.m_bDraging = FALSE; //完成拖动 *result=0; } void CPeerFileListView::OnLocalRC(NMHDR* pNotifyStruct,LRESULT* result) { if(list.GetItemCount()<=0) return; LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNotifyStruct; CPoint point; ::GetCursorPos(&point); // ScreenToClient(&point); CMenu menu; VERIFY(menu.LoadMenu(IDR_FILE_LOCAL)); CMenu* pPopup = menu.GetSubMenu(0); ASSERT(pPopup != NULL); if(lpnmlv->iItem<0) pPopup->EnableMenuItem(IDR_FILE_LOCAL_DELFILE,MF_GRAYED); CWnd* pWndPopupOwner = this; while (pWndPopupOwner->GetStyle() & WS_CHILD) pWndPopupOwner = pWndPopupOwner->GetParent(); pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWndPopupOwner); } void CPeerFileListView::OnFileLocalCreatedir() { // TODO: Add your command handler code here CCreateDirDlg dir(1,this); dir.DoModal(); } void CPeerFileListView::OnFileLocalDelfile() { if(MessageBox( "确定要删除吗?","提示",MB_YESNO)!=IDYES) return; // TODO: Add your command handler code here POSITION pos = list.GetFirstSelectedItemPosition(); int nItem; CString filename,attrib; while (pos) { nItem = list.GetNextSelectedItem(pos); filename=list.GetItemText(nItem,0); attrib=list.GetItemText(nItem,1); if(filename=="." || filename=="..") continue; if(attrib=="文件夹") { if(!RemoveDirectory(path+"\\"+filename)) MessageBox("删除文件夹:"+path+"\\"+filename+" 出错!,可能目录不为空"); } else { if(!DeleteFile(path+"\\"+filename)) MessageBox("删除文件夹:"+path+"\\"+filename+" 出错!"); } } Retrive(); }